package
{
	import com.hurlant.crypto.symmetric.CBCMode;
	import com.hurlant.crypto.symmetric.DESKey;
	import com.hurlant.util.Base64;
	
	import flash.utils.ByteArray;
	public class DESTools{
		static private const B:String="%";
		static private const Y:String="&";
		public function DESTools()
		{
		}
		static public function base64encode(data:String):String{
			var arr:ByteArray=new ByteArray();
			arr.writeUTFBytes(data);
			var encryptData:String = Base64.encodeByteArray(arr); 
			return encryptData;
		}
		static public function encrypt(data:String,keyStr:String="#L@D%S$G"):String{
				var key:ByteArray = new ByteArray();
				key.writeUTFBytes(keyStr.replace(B,Y));
				var des:DESKey = new DESKey(key);
				var cbc:CBCMode = new CBCMode(des); //加密模式,有多种模式供你选择  
				cbc.IV = key; //设置加密的IV  
				/* 得到的密文长度和明文的长度有关,规律大致是:明文<8 密文=12 ,明文<16 密文=24 ,明文>=16 密文=32......后面希望你们推一下*/  
				var tmpByteArray:ByteArray = convertStringToByteArray(data); //转换成二进制编码 (该函数自己定义)  
				cbc.encrypt(tmpByteArray);                         //利用加密模式对数据进行加密  
				var encryptData:String = Base64.encodeByteArray(tmpByteArray); //利用base64对密文进行编码      
				return encryptData;
		}
		static public function decrypt(data:String,keyStr:String="#L@D%S$G"):String{
			var key:ByteArray = new ByteArray();                          
			key.writeUTFBytes(keyStr.replace(B,Y));
			var des:DESKey = new DESKey(key);                          
			var cbc:CBCMode = new CBCMode(des); //加密模式,有多种模式供你选择  
			cbc.IV=key;
			var tmpByteArray:ByteArray = Base64.decodeToByteArray(data); //因为刚才加密的是把密文进行base64编码了,现在解码
			cbc.decrypt(tmpByteArray);                        //利用加密模式的解密算法解码
			var plain:String=convertByteArrayToString(tmpByteArray); //把二进制数据转换成字符串 函数代码如下
			return plain;
		}
		static private function convertStringToByteArray(str:String):ByteArray{  
			var bytes:ByteArray;  
			if (str){
				bytes=new ByteArray();  
				bytes.writeUTFBytes(str);  
			}  
			return bytes;  
		}  
		//ByteArray转String
		static private function convertByteArrayToString(bytes:ByteArray):String
		{
			var str:String;
			if (bytes)
			{                
				bytes.position=0;
				str=bytes.readUTFBytes(bytes.length);
			}
			
			return str;
		} 
	}
}